package com.zjsru.oneDay202302;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @Author: CookLee
 * @Date: 2023/2/20
 * 最好的扑克手牌
 *
 * "Flush"：同花，五张相同花色的扑克牌。
 * "Three of a Kind"：三条，有 3 张大小相同的扑克牌。
 * "Pair"：对子，两张大小一样的扑克牌。
 * "High Card"：高牌，五张大小互不相同的扑克牌。
 *
 * 输入：ranks = [13,2,3,1,9], suits = ["a","a","a","a","a"]
 * 输出："Flush"
 * 解释：5 张扑克牌的花色相同，所以返回 "Flush" 。
 *
 * 输入：ranks = [4,4,2,4,4], suits = ["d","a","a","b","c"]
 * 输出："Three of a Kind"
 * 解释：第一、二和四张牌组成三张相同大小的扑克牌，所以得到 "Three of a Kind" 。
 * 注意我们也可以得到 "Pair" ，但是 "Three of a Kind" 是更好的手牌类型。
 * 有其他的 3 张牌也可以组成 "Three of a Kind" 手牌类型。
 */
public class BestHand {
    
    /**
     * 模拟
     *
     * @param ranks 牌数
     * @param suits 花色
     * @return {@link String}
     */
    public String bestHand(int[] ranks, char[] suits) {
        Set<Character> set = new HashSet<>();
        for (char c : suits) {
            set.add(c);
        }
        // 花色都不同
        if (set.size() == 1) {
            return "Flush";
        }
        Map<Integer, Integer> map = new HashMap<>();
        for (int rank : ranks) {
            map.put(rank, map.getOrDefault(rank, 0) + 1);
        }
        for (Integer cot : map.values()) {
            //一个数大于三即可
            if (cot >= 3) {
                return "Three of a Kind";
            }
        }
        //五张牌都不同数
        if (map.size() == 5) {
            return "High Card";
        }
        return "Pair";
    }
    
    public static void main(String[] args) {
        BestHand bestHand = new BestHand();
        int[] ranks = new int[] {13, 2, 3, 1, 9};
        char[] suits = new char[] {'a', 'a', 'a', 'a', 'a'};
        System.out.println(bestHand.bestHand(ranks, suits));
    }
}
